package com.example.demo.sensitive.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.sensitive.dto.request.CheckTaskRequest;
import com.example.demo.sensitive.dto.response.CheckTaskResponse;
import com.example.demo.sensitive.entity.CheckTask;
import lombok.Data;

import java.time.LocalDateTime;
import java.util.List;

/**
 * @ClassName CheckTaskService
 * @Description 检查任务服务接口
 * @Author System
 * @Date 2025/9/19
 **/
public interface CheckTaskService extends IService<CheckTask> {

    /**
     * 分页查询任务
     */
    Page<CheckTaskResponse> getPageList(int current, int size, String status, 
                                       LocalDateTime startTime, LocalDateTime endTime, String keyword);

    /**
     * 根据ID查询任务
     */
    CheckTaskResponse getById(Long id);

    /**
     * 创建检查任务
     */
    Long createTask(CheckTaskRequest request);

    /**
     * 启动任务
     */
    void startTask(Long taskId);

    /**
     * 停止任务
     */
    void stopTask(Long taskId);

    /**
     * 取消任务
     */
    void cancelTask(Long taskId);

    /**
     * 删除任务
     */
    void deleteTask(Long taskId);

    /**
     * 获取任务进度
     */
    CheckTaskResponse.TaskProgress getTaskProgress(Long taskId);

    /**
     * 更新任务进度
     */
    void updateTaskProgress(Long taskId, Integer progress, Integer checkedTables, 
                           Long checkedRecords, Integer foundIssues);

    /**
     * 获取运行中的任务
     */
    List<CheckTaskResponse> getRunningTasks();

    /**
     * 获取待执行的任务
     */
    List<CheckTaskResponse> getPendingTasks();

    /**
     * 处理超时任务
     */
    void handleTimeoutTasks(int timeoutMinutes);

    /**
     * 获取任务统计
     */
    TaskStatistics getTaskStatistics(int days);

    /**
     * 任务统计内部类
     */
    @Data
    class TaskStatistics {
        private Integer totalTasks;
        private Integer completedTasks;
        private Integer failedTasks;
        private Integer runningTasks;
        private Long totalRecords;
        private Integer totalIssues;
        private Double successRate;
        private Long avgExecutionTime;
    }
}
